Cesium 功能实现

2023/09/15 16:19:43

Cesium 基础功能实现:初始化、加载影像

初始化

Cesium.Context.memoryThreshold = 8;
//设置GPU内存阈值为8MB,当GPU内存使用超过这个阈值时,Cesium将开始执行一些优化策略,以降低内存使用并提高性能。
//地图将被嵌入到具有ID为machineMap的DOM元素中
window.machineMap = new Cesium.Viewer("machineMap", {
  shadows: true, //确定阴影是否由太阳投射形成。
  sceneModePicker: false, //获取场景模式拾取器(SceneModePicker)对象。
  infoBox: false, //获取信息框(InfoBox)对象。
  shouldAnimate: true,
  skyAtmosphere: false, //环绕地球边缘的蓝天和光晕效果,设置为false可将其关闭。
  selectionIndicator: false, //获取选择指示符(SelectionIndicator)对象。
  navigation: true, //获取导航帮助按钮(NavigationHelpButton)对象。
  skyBox: new Cesium.SkyBox({
    //用于渲染星辰的天空盒,未定义时,使用默认星辰效果。
    sources: {
      positiveX: require("@/assets/img/lt/rightav9.jpg"),
      negativeX: require("@/assets/img/lt/leftav9.jpg"),
      positiveY: require("@/assets/img/lt/frontav9.jpg"),
      negativeY: require("@/assets/img/lt/backav9.jpg"),
      positiveZ: require("@/assets/img/lt/topav9.jpg"),
      negativeZ: require("@/assets/img/lt/bottomav9.jpg"),
    },
  }),
});
let scene = window.machineMap.scene; //获取场景(scene)对象,包含了地图中的三维场景元素和功能
let widget = window.machineMap.cesiumWidget; //获取CesiumWidget对象,用于渲染地图的核心部分
let credit = window.machineMap.scene.frameState.creditDisplay;//用于显示地图上的信用标识的对象
credit.container.remove(credit._imageContainer);//从信用标识容器中移除了图像容器,通常是地图底部显示的Cesium图标和文本,即去掉cesium水印

try {
  console.log("开启无人机地图");
  // 设置相机位置,定位至模型
  scene.camera.setView({
    // 将经度、纬度、高度的坐标转换为笛卡尔坐标
    destination: Cesium.Cartesian3.fromDegrees(116.773446, 23.471069, 4632),
    orientation: {
      heading: 0.29510551037694466, // 相机的方向,单位是弧度,默认朝北
      pitch: -0.677166982317591,    // 相机的俯仰角度,单位是弧度,默认是朝下
      roll: 6.283185307179586,      // 相机的滚动角度,单位是弧度,默认是0
    },
  });
} catch (e) {
  if (widget._showRenderLoopErrors) {
    var title = "渲染时发生错误,已停止渲染。";
    widget.showErrorPanel(title, undefined, e);
  }
}

Viewer设置

window.machineMap = new Cesium.Viewer("machineMap", {
  shadows: true, //确定阴影是否由太阳投射形成。
  sceneModePicker: false, //获取场景模式拾取器(SceneModePicker)对象。
  infoBox: false, //获取信息框(InfoBox)对象。
  shouldAnimate: true,
  skyAtmosphere: false, //环绕地球边缘的蓝天和光晕效果,设置为false可将其关闭。
  selectionIndicator: false, //获取选择指示符(SelectionIndicator)对象。
  navigation: true, //获取导航帮助按钮(NavigationHelpButton)对象。
  skyBox: new Cesium.SkyBox({
    //用于渲染星辰的天空盒,未定义时,使用默认星辰效果。
    sources: {
      positiveX: require("@/assets/img/lt/rightav9.jpg"),
      negativeX: require("@/assets/img/lt/leftav9.jpg"),
      positiveY: require("@/assets/img/lt/frontav9.jpg"),
      negativeY: require("@/assets/img/lt/backav9.jpg"),
      positiveZ: require("@/assets/img/lt/topav9.jpg"),
      negativeZ: require("@/assets/img/lt/bottomav9.jpg"),
    },
  }),
});

相机设置

scene.camera.setView({
  // 将经度、纬度、高度的坐标转换为笛卡尔坐标
  destination: Cesium.Cartesian3.fromDegrees(116.773446, 23.471069, 4632),
  orientation: {
    heading: 0.29510551037694466, // 相机的方向,单位是弧度,默认朝北
    pitch: -0.677166982317591,    // 相机的俯仰角度,单位是弧度,默认是朝下
    roll: 6.283185307179586,      // 相机的滚动角度,单位是弧度,默认是0
  },
});

加载影像

function loadTDT(viewer, node) {
  let tdtUrl = "https://t{s}.tianditu.gov.cn/"; // 天地图
  let subdomains = ["0", "1", "2", "3", "4", "5", "6", "7"];
  // 如果node.mapid不为null,则从viewer的imageryLayers中移除该ID对应的图层。
  if (node.mapid != null) viewer.imageryLayers.remove(node.mapid, false);

  // 向viewer的imageryLayers添加一个新的影像提供者,并将其ID赋值给node.mapid
  node.mapid = viewer.imageryLayers.addImageryProvider(
    new Cesium.UrlTemplateImageryProvider({
      url: tdtUrl +
        "DataServer?T=" +
        node.mapStyle +
        "&x={x}&y={y}&l={z}&tk=" +
        node.token,
      subdomains: subdomains,
      tilingScheme: new Cesium.WebMercatorTilingScheme(),
      maximumLevel: 18,
    })
  );
}
// URL模板中的{s}会被替换为subdomains数组中的一个元素,也就是一个子域名。这意味着,每次请求影像数据时,都会从这八个子域名中选择一个来用。
function loadTIN(viewer, node) {
  let terrainProvider = new Cesium.CesiumTerrainProvider({
    url: data_url,
    isSct: true, // 表示使用SCT(Scaled and Offset Terrain)地形数据格式
    requestVertexNormals: true, // 表示是否请求顶点法线信息
    requestWaterMask: true, // 表示是否请求水面遮罩信息
  });
  viewer.terrainProvider = terrainProvider;
}